package com.xjh.basestudy.javabase.streamandlambda;

/**
 * @author XuJianHua
 * @version 1.0
 * @company 湖南安第斯信息科技有限公司, 版权所有
 * @date 2022/6/25 17:18
 */
// 这也是一个函数式接口，但是如果加FunctionalInterface注解，该接口必须有一个未实现的方法
@FunctionalInterface
public interface FunctionalInterfaceTest<T, R, S> {
    /**
     * 接收三个泛型参数，第二个参数
     *
     * @param t
     * @param s
     * @return
     */
    R run(T t, S s);
    // 函数式接口里是可以包含静态方法，因为静态方法不能是抽象方法，是一个已经实现了的方法，所以是符合函数式接口的定义的（静态已实现方法和普通未实现方法可以共存）；
    // 可以有这个方法，但是这个方法不能以lambda的形式调用？ 也不需要，这样调用即可： FunctionalInterfaceTest.printHello();
    static void printHello(){
        System.out.println("Hello 霍建华");
    }

    /**
     * 描述：
     * 函数式接口:是一个接口，接口里面只能有一个抽象方法。
     *
     * 用途：
     * 主要用在Lambda表达式和方法引用（实际上也可认为是Lambda表达式）上。
     * 不像实现普通接口一样需要写实现类，可以用lambda表达式实现即可
     *
     * 理解：
     * lambda表达式操作的对象是一个lambda接口，在不写实现类的情况下实现该接口的功能，
     *
     * 使用条件：
     * 某方法的参数是一个lambda接口，不需要知道，也不需要出现该接口的名字
     * 重写该接口的方法实现一些功能（除非是静态已经实现的方法）
     *
     * 注意：
     * 方法体中只有一行代码时，可以省略return(实际上该行代码就是return的)，有多行时，必须写return+{}
     * Lambda表达式的返回类型不是接口中方法的返回类型，而是接口类型
     * 还不理解：
     * lambda接口return的到底是个什么东西，答案：接口的类型
     * 双冒号是什么意思： 答案：一个入参为空的lambda表达式
     * 比较器怎么用的？和双冒号什么关系？ 答案：
     *
     * 使用方法：
     *
     *
     *
     *
     * */
}
